package cn.mujiankeji.mbrowser.界面.框架.主视图

import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.snapshots.SnapshotStateList
import cn.mujiankeji.mbrowser.app.界面模块
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.界面.标签页.主页.主页标签状态

import cn.mujiankeji.mbrowser.界面.标签页.网页.网页标签状态
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.update
import org.koin.core.context.GlobalContext
import java.util.UUID


/**
 * 代表一个独立的浏览器窗口，它可以包含多个标签页。
 */
data class 窗口页状态(
    val id: String = UUID.randomUUID().toString(), // 窗口的唯一标识符
    val 标签页列表: SnapshotStateList<标签页状态> = mutableStateListOf()
){

    // 私有的、可变的当前活动标签页索引 State
    private val _当前活动标签页索引 = mutableStateOf(0)
    val 当前活动标签页索引: State<Int> = _当前活动标签页索引 // UI 可能不需要直接观察这个

    // 公开的、只读的当前活动标签页状态 Flow
    private val _当前活动标签页 = MutableStateFlow<标签页状态?>(null)
    val 当前活动标签页: StateFlow<标签页状态?> = _当前活动标签页.asStateFlow()

    /**
     * 更新内部的 _当前活动标签页 StateFlow。
     */
    private fun 更新当前活动标签页Flow() {
        _当前活动标签页.update {
            标签页列表.getOrNull(_当前活动标签页索引.value)
        }

    }


    fun 创建标签页(标签页 : 标签页状态){
        val currentIndex = _当前活动标签页索引.value

        // 1. 清除前进历史
        if (currentIndex < 标签页列表.size - 1) {
            for (i in 标签页列表.size - 1 downTo currentIndex + 1) {
                标签页列表.removeAt(i)
            }
        }

        // 2. 添加到标签页列表并激活
        标签页列表.add(标签页)
        _当前活动标签页索引.value = 标签页列表.lastIndex
        更新当前活动标签页Flow()
    }
    fun 创建默认标签页(){
        创建标签页(主页标签状态())
    }
    fun 创建网页标签页(url: String = "http://www.nr19.cn/",referer : String = "") {
        创建标签页(网页标签状态(url,referer,false))
    }

    /**
     * 切换到当前活动窗口中指定索引的标签页。
     */
    fun 切换标签页(索引: Int) {
        if (索引 in 标签页列表.indices) {
            _当前活动标签页索引.value = 索引
            更新当前活动标签页Flow()
        } else if (标签页列表.isEmpty()) {
            // 如果没有标签了（例如全部关闭），尝试添加一个默认的
            创建默认标签页()
        }
    }

    fun 界面被恢复(){
        if (标签页列表.isNotEmpty()) {
            // 切换窗口时，默认激活该窗口历史栈中的最后一个标签页 (或者当前活动标签页索引)
            // 为了简单起见，暂时总是激活最后一个，后续可以优化为记住每个窗口的活动标签页
            _当前活动标签页索引.value = 标签页列表.lastIndex
            更新当前活动标签页Flow()
        }
        else{
            创建默认标签页()
        }

    }
    fun 后退() : Boolean{
        if (当前活动标签页.value?.后退() == true) {
            return true
        }
        return if (当前活动标签页索引.value> 0) {
            _当前活动标签页索引.value = 当前活动标签页索引.value - 1
            更新当前活动标签页Flow()
            true
        }
        else {
            false
        }
    }
    fun 前进() : Boolean{
        if (当前活动标签页.value?.前进() == true) {
            return true
        }
        return if (当前活动标签页索引.value < 标签页列表.size - 1) {
            _当前活动标签页索引.value = 当前活动标签页索引.value + 1
            更新当前活动标签页Flow()
            true
        }
        else {
            false
        }
    }
    fun 可否后退() : Boolean{
        val currentTab = _当前活动标签页.value

        // 检查网页内部后退能力
        val canGoBackInWebView = currentTab?.可否后退?.value ?: false

        // 检查标签历史栈后退能力
        val canGoBackInTabHistory = _当前活动标签页索引.value > 0

        // 两者有一个可以后退就返回true
        return canGoBackInWebView || canGoBackInTabHistory
    }
    fun 可否前进() : Boolean{
        val currentTab = _当前活动标签页.value

        // 检查网页内部前进能力
        val canGoForwardInWebView = currentTab?.可否前进?.value ?: false

        // 检查标签历史栈前进能力
        val canGoForwardInTabHistory = if (标签页列表.isEmpty()) {
            false
        } else {
            _当前活动标签页索引.value < 标签页列表.size - 1
        }

        // 两者有一个可以前进就返回true
        return canGoForwardInWebView || canGoForwardInTabHistory
    }

    /**
     * 移除指定索引的标签页
     * @param 索引 要移除的标签页索引
     * @return 如果成功移除则返回true，否则返回false
     */
    fun 移除标签页(索引: Int): Boolean {
        if (索引 !in 标签页列表.indices) return false
        
        // 调用标签页的界面销毁方法
        标签页列表[索引].界面销毁()
        
        // 移除标签页
        标签页列表.removeAt(索引)
        
        // 调整当前活动标签页索引
        when {
            标签页列表.isEmpty() -> {
                // 创建一个新的默认标签页
                创建默认标签页()
            }
            _当前活动标签页索引.value >= 标签页列表.size -> {
                // 如果当前索引超出范围，切换到最后一个标签页
                _当前活动标签页索引.value = 标签页列表.lastIndex
                更新当前活动标签页Flow()
            }
            _当前活动标签页索引.value == 索引 -> {
                // 如果移除的是当前标签页，保持索引不变但更新Flow
                更新当前活动标签页Flow()
            }
            _当前活动标签页索引.value > 索引 -> {
                // 如果移除的标签页在当前标签页之前，索引减一
                _当前活动标签页索引.value--
                更新当前活动标签页Flow()
            }
            // 其他情况不需要调整索引
        }
        
        return true
    }
    
    /**
     * 移除指定ID的标签页
     * @param 标签页ID 要移除的标签页ID
     * @return 如果成功移除则返回true，否则返回false
     */
    fun 移除标签页(标签页ID: String): Boolean {
        val 索引 = 标签页列表.indexOfFirst { it.标识 == 标签页ID }
        return if (索引 != -1) 移除标签页(索引) else false
    }

}